0007. 整数反转【中等】
1. 📝 题目描述
给你一个 32 位的有符号整数 x,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:3211
2
2
示例 2:
输入:x = -123
输出:-3211
2
2
示例 3:
输入:x = 120
输出:211
2
2
示例 4:
输入:x = 0
输出:01
2
2
提示:
2. 🎯 s.1 - 转为字符串求解
c
int reverse(int x) {
char buf[12];
sprintf(buf, "%d", x);
int start = (buf[0] == '-') ? 1 : 0;
int end = strlen(buf) - 1;
while (start < end) {
char tmp = buf[start];
buf[start++] = buf[end];
buf[end--] = tmp;
}
long long ans = atoll(buf);
if (ans < -2147483648 || ans > 2147483647)
return 0;
return (int)ans;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
js
/**
* @param {number} x
* @return {number}
*/
var reverse = function (x) {
let ans =
x < 0
? '-' + x.toString().substring(1).split('').reverse().join('') - 0
: x.toString().split('').reverse().join('') - 0
const max = 2 ** 31 - 1
const min = -(2 ** 31)
return ans < min || ans > max ? 0 : ans
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
py
class Solution:
def reverse(self, x: int) -> int:
sign = -1 if x < 0 else 1
ans = sign * int(str(abs(x))[::-1])
if ans < -(2**31) or ans > 2**31 - 1:
return 0
return ans1
2
3
4
5
6
7
2
3
4
5
6
7
- 时间复杂度:
,字符串转换与反转的操作次数均与整数位数正相公 - 空间复杂度:
,字符串转换和拆分会产生这个长度的中间字符串
算法思路:
- 将
x转为字符串后反转,负数先去掉负号再处理尾部符号 - 将反转结果转回数字后加回正负号,检查是否超出
范围
3. 🎯 s.2 - 数学方法
c
int reverse(int x) {
long long ans = 0;
while (x != 0) {
ans = ans * 10 + x % 10;
x /= 10;
}
if (ans < -2147483648 || ans > 2147483647)
return 0;
return (int)ans;
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
js
/**
* @param {number} x
* @return {number}
*/
var reverse = function (x) {
const max = 2 ** 31 - 1
const min = -(2 ** 31)
let ans = 0
while (x !== 0) {
ans = ans * 10 + (x % 10)
x = Math.trunc(x / 10)
}
return ans < min || ans > max ? 0 : ans
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
py
class Solution:
def reverse(self, x: int) -> int:
sign = -1 if x < 0 else 1
ans = 0
x = abs(x)
while x != 0:
ans = ans * 10 + x % 10
x //= 10
ans *= sign
if ans < -(2**31) or ans > 2**31 - 1:
return 0
return ans1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
- 时间复杂度:
,循环执行次数等于整数位数 - 空间复杂度:
,只使用了常数级别的额外空间
算法思路:
- 每次迭代取出
x的最低位数字x % 10,拼接到ans的最高位:ans = ans * 10 + x % 10 - 同时
x /= 10去掉已处理的最低位,直到x == 0 - 最后检查
ans是否超出 范围,超出则返回 0